package main

import (
	// "bytes"
	f "fmt"
	"os/exec"
	// "time"
	"oo"
	"reflect"
	"strings"
)

func collection(arg ...int) {

	slice := []string{"north", "east", "south", "west"}

	myslice := slice

	for i, v := range slice[:] {
		// f.Printf("%v %v ", i, v)
		// //will panic once i = 3
		// f.Printf("%v %v %v\n", i, v, slice[i])
		// slice = slice[:3]

		if i != len(slice)-1 {
			slice[i] = strings.ToUpper(slice[i])
		}

		f.Printf("%v %v %v\n", i, v, slice[i])
	}

	f.Println(myslice[2])
}

type fn func(n *xfn) string

type xfn struct {
	name    string
	getName fn
}

func getname(myfn *xfn) string {

	return myfn.name

}

func main() {

	f.Println("abc")

	// f.Println(hello.GetX(4))

	// collection(1, 2, 3, 4, 5)

	//extension test

	// k := klog.NewLogger(nil, "") // Write to stdout and without prefix

	// num := 35

	// num2 := string(num)

	// const (
	// 	KB float64 = 1 << (iota * 10)
	// )

	// f.Println(KB)

	//var myxfn *xfn

	// myxfn := new(xfn)

	// myxfn.name = "Huangpeng"
	// myxfn.getName = getname

	// //myxfn = xfn{"HuangPeng", getname}

	// f.Println(myxfn.getName(myxfn))

	// num := make([]byte, 5)

	// v := reflect.ValueOf(num)

	// f.Println(v.Kind())
	// f.Println(v.Slice(0, 1))

	// type Elem interface{}

	// var el Elem

	// el = num

	// vo, ok := el.([]byte)

	// f.Println(ok, vo)

	// c := make(chan int)
	// o := make(chan bool)

	// go func() {

	// 	for {
	// 		select {

	// 		case v := <-c:
	// 			f.Println(v)
	// 			break
	// 		case <-time.After(5 * time.Second):
	// 			f.Println("timeout")
	// 			o <- true
	// 			break

	// 		}
	// 	}

	// }()

	// c <- 5
	// f.Println(<-o)

	// str := "hello"

	// str2 := str[:]

	// var mystr [5]rune

	// // str2[2] = "b"

	// for i, v := range str2 {
	// 	mystr[i] = v
	// }

	// f.Println(mystr[0])

	//command

	cmd := exec.Command("/bin/ls", "-l")

	buf, err := cmd.Output()

	if err != nil {
		f.Println("Error")
	}

	// f.Println(string(buf[:]))

	type Elem interface{}

	var foo func()

	foo = func() {

		f.Println("hello func")

	}

	func(bar func()) {

		R := reflect.ValueOf(bar)

		f.Println(R.Interface())

		//oo test
		O := oo.New(string(buf[:]))

		O.Warn(O.GetFlags())

		type Elem interface{}

		var a int = 3

		var b Elem

		b = a

		_, ok := b.(int)

		O.Warn(ok)

		O.Warn(oo.App)

	}(foo)
}
